package br.com.jspl.app.devices;
import java.awt.AWTEvent;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;

import br.com.jspl.app.ui.BarraFerramentas;
import br.com.jspl.app.ui.PonteiroMouse;

public class ProtoBoard extends JPanel implements MouseListener,MouseMotionListener, KeyListener{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -559377423401790878L;
	private static final int largura = 800, altura = 400, deslocamento = 8;
	private Circuito circuitoAtual;
	private PonteiroMouse Ponteiro;
//	private BarraFerramentas Barraferramts;
	private Point posAtualSelec;
	
	public ProtoBoard(){
		super(true);
		setSize(largura, altura);
		setLayout(null);
		setOpaque(false);
		addMouseListener(this);
		addMouseMotionListener(this);
		posAtualSelec = new Point(0,0);
		setCircuitoAtual(new Circuito(this));
	}
	public void paint(Graphics g) {

		int w = this.getWidth();
		int h = this.getHeight();
		w /= deslocamento;
		h /= deslocamento;
		for (int x = 0; x < w; x ++)
			for (int y = 0; y < h; y ++)			
					g.drawLine(x*deslocamento,y*deslocamento,x*deslocamento+1,y*deslocamento+1);
		
		//g.drawOval(x*deslocamento,y*deslocamento,3,3);
		/*
		g.setColor(Color.red);
		g.drawOval(posAtualSelec.x*deslocamento,posAtualSelec.y*deslocamento,4,6);
		g.setColor(Color.black);*/
		circuitoAtual.desenha(g);
		super.paint(g);
		
		
	}
	
	public Circuito getCircuitoAtual() {
		return circuitoAtual;
	}
	public void setCircuitoAtual(Circuito circuitoAtual) {
		this.circuitoAtual = circuitoAtual;
	}
	public void setPonteiro(PonteiroMouse ponteiro) {
		Ponteiro = ponteiro;		
	}
	/**
	 * Rotinas de manipulao de enventos
	 */
	public void mouseClicked(MouseEvent e) {
		/*Graphics g = getGraphics();
		Point p = getClick();
		g.drawOval(p.x-2,p.y-2,4,4);
		Point q = getClick();
		g.drawOval(q.x-2,q.y-2,4,4);
		g.drawLine(p.x,p.y,q.x,q.y);
		g.dispose();*/
		
	}
	public void mouseDragged(MouseEvent evt) {}
	public void mousePressed(MouseEvent e) {
		Componente c = Ponteiro.getComponenteSelecionado();	
		if(e.getButton() == 3 && circuitoAtual.getLigado()) {
			if (e.getSource() instanceof Componente) {
				Componente comptemp = (Componente)e.getSource();
				if(comptemp instanceof FontePulsadora) {
					FontePulsadora fp= (FontePulsadora) comptemp;
					fp.inverteEstado();
					circuitoAtual.desligaCircuito();
					circuitoAtual.ligaCircuito();
				}
			}
		}
		if (c != null) {
//			Avisa ao objeto que ele foi clicado
//			Caso o Mesmo retorne true, no reinicia o ponteiro
			if (c.fuiClicado(this,e)) {
				setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));			
				reiniciaPonteiro();
			}
		}
	}
	public void mouseReleased(MouseEvent e) {}
	public void mouseEntered(MouseEvent e) {
		//Verifica se o ponteiro esta ativa e caso afirmativo, esconde o ponteiro normal do mouse
		if (e.getSource() instanceof Componente) 		
		{
			Componente comptemp = (Componente)e.getSource();
			comptemp.setBorder(new EtchedBorder());
		}
		else
		{
			if (Ponteiro.isAtivo())
			{
				add(Ponteiro);
				Ponteiro.setVisible(true);
				setCursor(Ponteiro.getCursorVazio());
				//Componente comptemp = (Componente)e.getSource();
				//comptemp.setBorder(new EtchedBorder());
			}
			else		
				setCursor(Ponteiro.getCursorAtual());
		
		}
	}
	public void mouseExited(MouseEvent e) {
		if (e.getSource() instanceof Componente) 		
		{
			Componente comptemp = (Componente)e.getSource();
			comptemp.setBorder(null);
		}
		else
		{
		Ponteiro.setAtivo(false);
		remove(Ponteiro);
		Ponteiro.setVisible(false);
		}
	}
	public void setposAtualSelec(Point pmvt, boolean MouseNormal,Componente c)
	{
		Point ponto = new Point();
		ponto.x = (int) pmvt.getX() / deslocamento;
		ponto.y = (int) pmvt.getY()/ deslocamento;	
		if (MouseNormal)
		{
			Point w = c.getPInicioComponente();
			ponto.x+=w.x;
			ponto.y+= w.y;
		}
		posAtualSelec = ponto;
	}
	public void mouseMoved(MouseEvent evt) {
		/*
		Componente cPont;
		//Verifica se o componente selecionando atualmente  o cabo
		cPont = Ponteiro.getComponenteSelecionado();
		if (cPont instanceof Cabo )
		{*/
			if (evt.getSource() instanceof Componente) 		
			{
				Componente c = (Componente)evt.getSource();
				setposAtualSelec(evt.getPoint(),true,c);
			}
			else
				setposAtualSelec(evt.getPoint(),false,null);	
	/*	}
		else
			setposAtualSelec(evt.getPoint(),false,null);
		*/
		
		if (Ponteiro.isAtivo())
			
		
			Ponteiro.atualizaPosicao(posAtualSelec ,evt);			
		
		repaint();
		
		
	}
	
	

//	Funo necessaria para poder se cliclar dois pontos
		
	public MouseEvent getClick()
	{
		EventQueue eq = Toolkit.getDefaultToolkit().getSystemEventQueue();
		while (true)
		{
			try
			{
				AWTEvent evt = eq.getNextEvent();
				if (evt.getID() == MouseEvent.MOUSE_PRESSED)
				{
					MouseEvent mevt = (MouseEvent) evt;
					return mevt;
				}
			} catch (InterruptedException e) {}
		}
		
	}
	public void reiniciaPonteiro()
	{
		if (Ponteiro != null) remove(Ponteiro);
		Ponteiro = new PonteiroMouse();
		Ponteiro.setDeslocamento(8);
	//	Barraferramts.setPonteiro(Ponteiro);
	}
	public Point getPosAtualSelec() {
		return posAtualSelec;
	}
	public void setBarraferramentas(BarraFerramentas setBarraferramentas) {
//		Barraferramts = setBarraferramentas;
	}
	public PonteiroMouse getPonteiro() {
		return Ponteiro;
	}
	//Eventos do teclado
	public void keyPressed(KeyEvent evt)
	{
		if(evt.getSource() instanceof Componente)
		{
			int keyCode = evt.getKeyCode();
			if (keyCode==KeyEvent.VK_DELETE)
				remove((Component)evt.getSource());
		}
	}
	public void keyReleased(KeyEvent evt)
	{
		
	}
	public void isFocusTraversable(KeyEvent evt)
	{
		
	}
	public void keyTyped(KeyEvent evt)
	{
		
	}
	
	
}
